到目前為止,我們講過了該怎麼「暴力」枚舉問題、教過了該遞迴實作上的技巧。
不過在遇到某些問題時,你是否曾想過:「感覺只要我每個步驟都採用最佳的策略,好像就能得到最好的結果了?」
例如今天超市多項商品同時推行特價活動,你在有一個固定的預算的情況下,想買到盡可能多的商品,此時你的策略可能會是先購買單價最低的商品,直到該商品購買完畢或預算用完,然後再考慮下一個單價較低的商品。透過這種方式,你每一步都在做當下看起來最合算的選擇,以期最大化購買的商品數量。
這樣的策略看起來很貪心,因此有些演算法若含有與上面例子類似的「貪心」的精神,那它就是一種「貪心演算法」
貪心算法(英文:greedy algorithm)就是用電腦來模擬一個「貪心」的人怎麼做決定。這個人超級貪心,每做一步都是按照某種標準挑最好的選項。但他只看到眼前,不會想到後面會發生什麼事。
顯然,用貪心法不一定每次都能找到最佳解。所以一般用這種方法的時候,都要確定能證明它是對的。
貪心算法在有「最佳子結構」的問題上特別有用。這個「最佳子結構」就是說,問題可以拆成小問題來解,而這些小問題的最佳解可以用來找出整個問題的最佳解。